package org.ivwsqii.zookeeper;

import org.apache.zookeeper.KeeperException;

import java.io.IOException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

public class ResilientConfigUpdater {
    public static final String PATH="/test";
    private ChangedActiveKeyValueStore store;
    private Random random=new Random();

    public ResilientConfigUpdater(String hosts) throws IOException, InterruptedException, KeeperException {
        store=new ChangedActiveKeyValueStore();
        store.connect(hosts);
    }
    public void run() throws InterruptedException, KeeperException{
        while(true){
            String value=random.nextInt(100)+"";
            System.out.printf("Set %s to %s\n",PATH,value);
            store.write(PATH, value);
            TimeUnit.SECONDS.sleep(3);
        }
    }

    /**
     * 在这段代码中没有对KeepException.SeeionExpiredException异常进行重试，因为一个会话过期时，
     * ZooKeeper对象会进入CLOSED状态，此状态下它不能进行重试连接。
     * 我们只能将这个异常简单抛出并让拥有着创建一个新实例，以重试整个write()方法。
     * 一个简单的创建新实例的方法是创建一个新的ResilientConfigUpdater用于恢复过期会话。
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        while(true){
            try {
                ResilientConfigUpdater configUpdater = new ResilientConfigUpdater("192.168.1.23:2181");
                configUpdater.run();
            }catch (KeeperException.SessionExpiredException e) {
                // start a new session
            }catch (KeeperException e) {
                // already retried ,so exit
                e.printStackTrace();
                break;
            }
        }
    }
}
